iT邦幫忙

2021 iThome 鐵人賽

DAY 30
1
Software Development

Python GUI 專案設計模式及好用的開發技巧系列 第 31

如何在Python GUI 中隨時記錄log並顯示在UI上呢?

  • 分享至 

  • xImage
  •  

生活中的每個細節,有些人習慣使用圖像的方式做紀錄;有些人更喜歡使用文字去做紀錄。 那在資訊領域中呢? 有一群人就喜歡啃Raw data 所紀錄出的log ....

Python 中有一個好用的module,logging,其可以將log 等級做分類,細則就隨便google找找都有。 這次的重點則是,要怎麼把程式中隨時印在console 中的print 資訊,導入到UI 元件中。

筆者打算用signal的形式直接去實作,如果對於使用callback有興趣的朋友就另外去找其他文章來看囉.

使用工具

  • PySide2-Designer
  • PySide2

作法:

  1. 先做一個Handler來傳遞參數到UI端使用
class LoggingHandler(QObject):
    finished = Signal()
    updated = Signal(str)

    @QtCore.Slot()
    def __init__(self):
        super(LoggingHandler, self).__init__()
        self.working = True

    def work(self):
        global v_logging
        if self.working:
            self.updated.emit(v_logging)
        self.finished.emit()
  1. 在ui_mainwindow class中設定thread3的預設值為空及要啟用的功能
    self.thread3 = None
  1. 撰寫runloggingtasks 功能
def runloggingTasks(self):
        global v_logging
        self.Logging = LoggingHandler()
        self.thread3 = QThread()
        self.thread3.started.connect(self.Logging.work)
        self.Logging.updated.connect(self.updateText)
        self.Logging.finished.connect(self.thread3.quit)
        self.Logging.finished.connect(self.Logging.deleteLater)
        self.Logging.moveToThread(self.thread3)
        self.thread3.start()
        v_logging = "log start"

[筆記]
(1) 筆者是使用v_logging 共用變數當成queue使用
(2) v_logging 可被用在任何放置print 的地方,筆者在這邊是測試功能,所以直接放置在功能內

筆者存放log的UI元件是使用lineEdit

  1. 回到ui_mainwindow class中, 啟用runloggingtasks功能
    self.runloggingTasks()

效果:
執行後可以看到紅色框框處多了log start 字樣

結論:
網路上有使用logging module + handleer的形式做出來,但筆者在看了程式碼後發現對方寫得太複雜了,筆者只想簡單實作就好。所以選擇使用signal + slot + queue的形式來實作。

後記:
做一個新專案來學一種新的應用真的是很棒的形式,PySide 系列筆者還是會繼續在鐵人賽後繼續鑽研下去,因為真的很有趣。網路上找到的參考資料並不一定適合每一個人,唯有取經跟自幹整合後才會變成自己的產物。

PS: 可惜自幹純手刻資料清洗工具的side project還沒做完,因為這專案還在繼續開發中,未來相關的分享會出現在其他地方吧。暫定是筆者即將開始撰寫的medium。


上一篇
今晚,我想來點。。。 (菜單在哪?)
系列文
Python GUI 專案設計模式及好用的開發技巧31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言